今天的標題是"取得及更新Entity Card Values",而不是"更新Entity"。
原因是Entity
在建立之後,我們不太會去對Entity
本身做改變,一般想改動的是其card values
,也就是fields
的部份。
要取得及更新Entity Card Values
,需要使用getter
及setter function
(雖然這看起來不太pythonic
, we know...)。
要改變card values
有兩種方法:
base.GetEntityCardValues
及SetEntityCardValues
。Entity
本身的get_entity_values
及set_entity_values
。我們比較習慣後者,所以以此為我們的coding style。
舉例來說,下面我們先建立一個座標為(1,2,3)
的node Entity
,接著利用Entity.set_entity_values
將X
座標改為10
。
def get_set_node_card_values():
deck = constants.LSDYNA
type_ = 'NODE'
fields = {'X': 1, 'Y': 2, 'Z': 3}
node = base.CreateEntity(deck, type_, fields)
set_ret = node.set_entity_values(deck, {'X': 10})
print(f'{set_ret=}')
card_values = node.get_entity_values(deck, tuple(fields.keys()))
print(f'{card_values=}')
如果set
成功的話會回傳0
,否則則回傳非零值
。
如果get
成功的話會回傳一個dict
,key
為所要求的field
,value
為其card value
,
否則會回傳一個空的dict
。
觀察card_values
可知,我們已經成功將X
座標改為10
。
set_ret=0
card_values={'X': 10.0, 'Y': 2.0, 'Z': 3.0}
舉個get
及set
失敗的例子來說。
def get_set_node_card_values_failed():
deck = constants.LSDYNA
type_ = 'NODE'
fields = {'X': 1, 'Y': 2, 'Z': 3}
node = base.CreateEntity(deck, type_, fields)
set_ret = node.set_entity_values(deck, {'A': 10})
print(f'{set_ret=}')
card_values = node.get_entity_values(deck, ['A'])
print(f'{card_values=}')
由於A
並不存在node
的fields
內,所以set
會失敗,回傳值為1
。
同理get
也會失敗,回傳值為空的dict
。
set_ret=1
card_values={}
對於一些少遇見的Entity
,我們並不熟悉其有哪些fields
可以控制,此時可以先利用Entity
的card_fields
取得fields
,再搭配get_entity_values
來觀察其card values
。
def get_all_node_card_values():
deck = constants.LSDYNA
type_ = 'NODE'
fields = {'X': 1, 'Y': 2, 'Z': 3}
node = base.CreateEntity(deck, type_, fields)
fields = node.card_fields(deck)
card_values = node.get_entity_values(deck, fields)
print(f'{card_values=}')
其輸出為:
card_values={'TYPE': '*NODE', 'NID': 1, 'X': 10.0, 'Y': 2.0, 'Z': 3.0, 'TC': '0: none', 'RC': '0: none', 'Name': '', 'FROZEN_ID': 'NO', 'FROZEN_DELETE': 'NO', 'DEFINED': 'YES', 'AUXILIARY': 'NO', 'Comment': '', 'MBContainer': None, 'MBContainers': []}
另外,每個Entity
有一些常用的attribute
,不需使用getter
,就可以直接存取,像是Entity._name
、Entity_id
及Entity._comment
。
比較特別的是point-like Entity
,可以利用Entity.position
來直接get
及set
其座標。所以這個例題比較有效率的寫法會是下面這樣。
def get_set_node_card_values_fast():
deck = constants.LSDYNA
type_ = 'NODE'
fields = {'X': 1, 'Y': 2, 'Z': 3}
node = base.CreateEntity(deck, type_, fields)
node.position = (10, 2, 3)
print(f'{node.position=}')
其輸出為:
node.position=(10.0, 2.0, 3.0)
關於ANSA的CRUD操作,於今天告一段落。[Day06]開始,我們將利用這些操作,建立一個box drop project。
除了需要使用getter
及setter
有些不Pythonic
外,我們覺得ANSA API使用上比較麻煩的地方是,每一種CRUD操作,對於成功或失敗,會回傳不同的值。所以有時在debug時,需要來回穿梭於回傳值及手冊間,難道這是BETA CAE Systems想讓我們多熟悉手冊而特意安排的(苦笑)?